package com.aaa.gs.service.impl;

import com.aaa.common.util.CustomException;
import com.aaa.common.util.Result;
import com.aaa.common.util.ResultStatus;
import com.aaa.common.vo.Page;
import com.aaa.gs.dao.ProductDao;
import com.aaa.gs.entity.Product;
import com.aaa.gs.service.ProductService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * (Product)表服务实现类
 *
 * @author makejava
 * @since 2023-06-08 09:39:52
 */
@Service("productService")
public class ProductServiceImpl implements ProductService {
    @Resource
    private ProductDao productDao;

    //引入注入 远程调用的模板类RestTemplate
    @Resource
    private RestTemplate restTemplate;


    @Override
    public Result queryOrderById(Integer orderId) {
        //ribbon 自己编写请求方式
        //return restTemplate.getForObject("http://172.16.9.101:16411/order/queryById?id="+orderId, Result.class);
        //注意事项：1，请求方式必须和远程接口的资源暴露方式一致
        //         2,url中的服务名称必须和远程服务注册到注册中心的名称一致
        //         3,参数名称必须和远程服务的形参一致（单个属性），如果是对象，必须url中拼装属性必须和对象中的属性一致
        //         4,返回值必须和远程服务方法的返回值一致
        //         5,请求的uri 必须和远程调用的方法请求路径一致
        return restTemplate.getForObject("http://OrderServer/order/queryById?id="+orderId, Result.class);
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public Product queryById(Long id) {
        //从本服务的数据库中获取当前商品对象
        Product product = this.productDao.queryById(id);
        //获取该对象的订单ID
        Integer orderId = product.getOrderId();
        //根据订单编号调用远程获取订单方法获取订单封装对象
        Result result = this.queryOrderById(orderId);
        //设值result
        product.setResult(result);
        return product;
    }

    /**
     * 分页查询
     *
     * @param page 筛选条件
     * @return 查询结果
     */
    @Override
    public PageInfo queryByPage(Page<Product> page) {
        //分页操作  分页参数一定要进行传递
        if (page == null || page.getPageNo() == null || page.getPageNo() == 0 || page.getPageSize() == null || page.getPageSize() == 0) {
            //进行业务编写时，可以抛出自定义异常
            throw new CustomException(ResultStatus.PARAM_NOT_EMPTY.getReturnCode(),
                    ResultStatus.PARAM_NOT_EMPTY.getReturnMsg());
        }
        PageHelper.startPage(page.getPageNo(), page.getPageSize());
        //获取查询对象
        Product product = page.getData();
        return new PageInfo(productDao.queryAllByLimit(product));
    }

    /**
     * 新增数据
     *
     * @param product 实例对象
     * @return 实例对象
     */
    @Override
    @Transactional
    public Product insert(Product product) {
        this.productDao.insert(product);
        /*this.productDao.insert(product);
        System.out.println(1/0);
        this.productDao.insert(product);*/
        return product;
    }

    /**
     * 修改数据
     *
     * @param product 实例对象
     * @return 实例对象
     */
    @Override
    public Product update(Product product) {
        this.productDao.update(product);
        return this.queryById(product.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Long id) {
        return this.productDao.deleteById(id) > 0;
    }
}
